import org.junit.Test;

import java.util.Arrays;

/**
 * 数组 Array
 * 数组相当于一堆相同数据类型的数据
 */
public class 数组 {
    //1.数组定义：4种 创建数组初始化【静态初始化：给定值 动态初始化：无给定值】
    @Test
    public void testArray(){
        //注意：数组定义长度，不能改变
        int[] arr1=new int[4];//java推荐写法 动态初始化
        int arr2[]=new int[4];//c 推荐写法java兼容 动态初始化
        int[] arr3={1,2,3,};//静态初始化 元素可以直接使用
        int[] arr4=new int[]{1,2,3};//动态初始化
        //数组内部存的数据叫做元素，肯定是相同类型的
        //从arr3取出2的元素    数组名 下标
        System.out.println(arr3[1]);
        //arr3数组的长度 length
        System.out.println(arr3.length);
        //arr4的数组获取到第四个元素值 数组下标越界异常：下标超出数组长度
        //System.out.println(arr4[4]);//报错 ArrayIndexOutOfBoudsException
    }
    /**
     * 数组的迭代（遍历：输出数组所有元素值）三种
     * 1.普通迭代方式 for
     * 2.增强for的方式 推荐 JDK1.5之后
     * 3.工具类的方式
     */
    @Test
    public void testIterate(){
        //普通
        int[] arr={1,2,3,4};//静态初始化数组   通过数组名【下标】
       // for(int i=0;i<arr.length;i++){//拿数组下标
           // System.out.println(arr[i]);
       // }
       //增强for   遍历数组 拿元素值
        //for (int j:arr){//增强for的语法 遍历数据类型 引用：数组名
            //System.out.println(j);
       // }
        // 工具类 Arrays.toString（）直接打印数组元素值
        System.out.println(Arrays.toString(arr));
    }
    /**
     *  数组扩容 ：数组长度是固定的可以通过数组的扩容改
     */
    @Test
    public void testCopy(){
        //创建一个字符数组
        char[] arr={'唐','山'}; //想法：长度增加4
        //扩容：增加4个 克隆新的数组
        char[] temp=Arrays.copyOf(arr,4);
        arr=temp;
        arr[2]='工';
        arr[3]='业';
        System.out.println(arr);
        //需求：输出唐山工业

    }
    /**
     * 数组输出元素时，会有一些不同【查看数据是否是数组】
     * 数组类型，基础数据类型+引用类型
     */
    @Test
    public void testArrays(){
        //字符数组
        char[] china={'中','国'};
        System.out.println(china);//输出：中国 字符串
        //输出语句--Javaoop面向对象重载  一旦发现字符字符数组拼接 变成字符串
        //数值数组
        int[] i={1,2};
        System.out.println(i);//输出 【数据类型】[I@3d82c5f3 地址值


    }
    /**
     * 冒号排序：双层for循环的使用：外层for执行一次：执行全部
     *
     */
    @Test
    public void bubbleSort(){
        //静态初始化数组
        int[] arr={3,6,4,1}; // 1.3.4.6升序
        //①外层for控制轮 i=0 1 2  3轮
        for(int i=0;i< arr.length-1;i++){
            //②内层for控制轮 j=3轮递减-1次
            for(int j=0;j<arr.length-1-i;j++){
                //③交换：创建第三方数组，接收【相邻元素】数组名+下标  第一个元素比第二个大 条件成立：交换 升序
                if(arr[j]>arr[j+1]){
                    //创建第三方数组 变量名 temp
                    int temp=arr[j]; //大元素交给第三方变量保存
                    arr[j]=arr[j+1]; //第二个元素换给第一个元素位置
                    arr[j+1]=temp; //保存第三方变量【大数】交给第二个元素
                }
            }

        }
        System.out.println(Arrays.toString(arr));//遍历数组

    }


    @Test
    public  void testSort(){
        int[] arr={3,6,4,1};
        //工具类 Arrays sort（）方法排序 默认排序
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}
